#pragma once

#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<functional>
#include<pthread.h>

class Thread;

class Context
{
public:
    Thread *this_;
    void *args_;
public:
    Context()
    :this_(nullptr)
    ,args_(nullptr)
    {

    }

    ~Context()
    {

    }
};

class Thread
{
public:
    typedef std::function<void*(void*)> func_t;
    const int num = 1024;

public:
    Thread(func_t func, void *args = nullptr, int number = 0)
    :func_(func)
    ,args_(args)
    {
        //给线程命名
        char buffer[num];
        snprintf(buffer,sizeof buffer,"thread-%d",number);
        name_=buffer;

        Context* ctx=new Context();
        ctx->this_=this;
        ctx->args_=args_;

        //创建线程
        //注意func_t不是函数指针，是一个包装器对象，在这里pthread_create只能传入函数指针
        int n=pthread_create(&tid_,nullptr,start_routine,ctx);
        assert(n==0);
        (void)n;

    }

    //在类内创建线程，想让线程执行对应方法，需要将方法设置为static，静态成员函数参数中没有默认的this指针
    //注意：静态方法不能调用成员方法或者成员变量
    static void* start_routine(void* args)
    {
        Context *ctx=static_cast<Context*>(args);
        void *ret =ctx->this_->run(ctx->args_);
        delete ctx;
        return ret;
    }

    void *run(void* args)
    {
        return func_(args);
    }

    void join()
    {
        int n=pthread_join(tid_,nullptr);
        assert(n==0);
        (void)n;
    }

    ~Thread()
    {

    }

private:
    std::string name_;//线程名
    func_t func_;//调用函数
    void *args_;//参数
    pthread_t tid_;//线程对象

};




























































